import 'package:flutter/material.dart';
import 'package:t_flutter_test/router/index.dart' show allRouter;

class LayoutWidget extends StatefulWidget {
  const LayoutWidget({
    super.key,
    this.isFirst = false,
    required this.body,
    this.floatingActionButton,
  });

  final bool isFirst; // 是否是首页 默认 false
  final Widget body; // 页面主体
  final Widget? floatingActionButton; // 右下角悬浮按钮

  @override
  State<LayoutWidget> createState() => LayoutWidgetState();
}

class LayoutWidgetState extends State<LayoutWidget> {
  String title = '默认标题';

  @override
  void didChangeDependencies() {
    /* 
      坑点:
        didChangeDependencies() 方法在依赖发生变化时被调用, 例如: 路由跳转、系统主题变化、屏幕旋转等。
        所以当该方法内部只有 debugPrint('didChangeDependencies') 时 跳转其他页面时只有目标页面 初始化时执行了 didChangeDependencies

        若当该方法内部有 debugPrint('didChangeDependencies ${ModalRoute.of(context)!.settings.arguments}'); 时
        ModalRoute.of(context)!.settings.arguments 依赖于当前路由的参数 所以当路由改变时, didChangeDependencies 会被调用
        所以当a页面跳转到b页面时, a页面和b页面 的 LayoutWidget组件 都会触发 didChangeDependencies

        ***疑问点: 
        但当 b页面跳转到c页面时, 只有 b页面和c页面 的 LayoutWidget组件 触发了 didChangeDependencies
        不理解为啥a页面的未触发, 即使 b页面跳转c页面时 是 pushReplacement 也是同样的
     */
    // 是首页，则显示首页的标题
    if (widget.isFirst) {
      title = allRouter[0].name;
    } else {
      // 不是首页，则显示路由参数中的标题
      title =
          (ModalRoute.of(context)!.settings.arguments
              as Map<String, String>?)?['appBarTitle'] ??
          '默认标题';
    }
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title, style: TextStyle(color: Colors.white)),
        centerTitle: true,
        backgroundColor: Colors.deepOrange,
        leading:
            widget.isFirst
                ? null
                : IconButton(
                  icon: Icon(Icons.arrow_back, color: Colors.white),
                  onPressed: () {
                    Navigator.pop(context);
                  },
                ),
      ),
      body: widget.body,
      floatingActionButton: widget.floatingActionButton,
    );
  }
}
